package entity

import (
	"fmt"
	"time"

	"github.com/google/uuid"
	"gorm.io/gorm"
)

// ToolDBConnection 工具数据库连接配置
type ToolDBConnection struct {
	ID        uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()"`
	Name      string    `gorm:"unique;not null;size:100"`  // 连接名称
	Host      string    `gorm:"not null;size:255"`         // 主机地址
	Port      int       `gorm:"not null;default:5432"`     // 端口
	Username  string    `gorm:"not null;size:100"`         // 用户名
	Password  string    `gorm:"not null;size:255"`         // 加密后的密码
	DBName    string    `gorm:"not null;size:100"`         // 数据库名
	SSLMode   string    `gorm:"size:20;default:'disable'"` // SSL模式
	Timezone  string    `gorm:"size:50;default:'UTC'"`     // 时区
	IsEnabled bool      `gorm:"not null;default:true"`     // 是否启用
	IsDefault bool      `gorm:"not null;default:false"`    // 是否为默认连接
	CreatedAt time.Time `gorm:"autoCreateTime"`
	UpdatedAt time.Time `gorm:"autoUpdateTime"`
}

// TableName 指定表名
func (ToolDBConnection) TableName() string {
	return "tool_db_connections"
}

// BeforeCreate GORM钩子
func (t *ToolDBConnection) BeforeCreate(tx *gorm.DB) error {
	if t.ID == uuid.Nil {
		t.ID = uuid.New()
	}
	return nil
}

// BeforeUpdate GORM钩子
func (t *ToolDBConnection) BeforeUpdate(tx *gorm.DB) error {
	// 如果设置为默认连接，需要将其他连接设为非默认
	if t.IsDefault {
		tx.Model(&ToolDBConnection{}).Where("is_default = ? AND id != ?", true, t.ID).Update("is_default", false)
	}
	return nil
}

// GetDSN 获取数据库连接字符串
func (t *ToolDBConnection) GetDSN() string {
	return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=%s",
		t.Host, t.Port, t.Username, t.Password, t.DBName, t.SSLMode, t.Timezone)
}

// IsActive 检查连接是否激活
func (t *ToolDBConnection) IsActive() bool {
	return t.IsEnabled
}
